#ifndef FILE_H
#define FILE_H

#include"stdlib.h"

enum fileType{
    file,directory
};
// 文件特定数据
struct FileData {
    char *content; // 文件内容
    int contentSize; // 文件内容大小
    FileData(char* content=nullptr,int size=0):content(content),contentSize(size){}
};
struct File;
// 目录特定数据
struct DirectoryData {
    File *children[10]; // 指向子文件或目录的指针数组
    int childCount; // 子文件或目录的数量
    DirectoryData(File* child[10]=nullptr,int count=0):childCount(count){
        for(int i=0;i<10;i++)children[i]=nullptr;
    }
};
struct File{
    int id;
    char name[16];
    fileType type;
    char location[512];//文件位置
    int size;
    int permission;
    FileData fileData; // 用于文件的数据
    DirectoryData directoryData; // 用于目录的数据
    File(int id=0,const char* n="",fileType type=fileType::file,const char* l="",int size=0,int permission=0):fileData(),directoryData(),id(id),size(size),permission(permission){
        strcpy(name,n);
        strcpy(location,l);        
    }
};
struct openFile{
    int id;
    char name[16];
    int openCount;//打开次数
    openFile(int i=0,const char* n="",int o=0):id(i),openCount(o){strcpy(name,n);}
};
class FileSystem{
public:
    File* root;//根目录
    File* current;//当前文件

    FileSystem();
    void initialize();
    File* allocateFile();//分配和归还，仿照PCB设计
    void release(File* file);

    File* createFile(const char* name,fileType);
    void deleteFile(const char* name);//打开文件无法删除
    void open(const char* name);
    void close(const char* name);
    int read(const char* name,char* buffer,int size);//从文件读取指定大小数据
    int write(const char* name,int position,const char* data,int size);//从文件指定位置写入指定数据

    void cd(const char* name);//进入当前目录中的子目录
    void ls();//显示目录内容
    void cat();//显示文件内容
    void pwd();//当前目录路径
    void echo(const char* data);//输出数据
};

#endif